/*
 *  $Id: Paths.cs 1199 2010-11-20 17:38:24Z thenn.erannor $
 *	This file is a part of Ragima CCG.
 *	(C) 2008-2010 Ragima development group.
 *
 *	Licensed under the terms of the GNU GPL License version 2.
 *
 */

using System.IO;

namespace Ragima {
    /// <summary>
    /// Класс, содержащий все основные пути в проекте.
    /// </summary>
    public static class Paths {
        /// <summary>
        /// Корневой путь.
        /// </summary>
        public static readonly FilePath Root = new FilePath(Directory.GetCurrentDirectory());
        /// <summary>
        /// Путь к локализациям.
        /// </summary>
        public static readonly FilePath Languages = Root.GetDirectory("Languages");

        /// <summary>
        /// Путь к основным данным.
        /// </summary>
        public static readonly FilePath Data = Root.GetDirectory("Data");
        /// <summary>
        /// Путь к шрифтам.
        /// </summary>
        public static readonly FilePath Fonts = Data.GetDirectory("Fonts");
        /// <summary>
        /// Путь к графическим изображениям.
        /// </summary>
        public static readonly FilePath Images = Data.GetDirectory("Images");
        /// <summary>
        /// Путь к изображениям эффектов.
        /// </summary>
        public static readonly FilePath AffectImages = Images.GetDirectory("Affects");
        /// <summary>
        /// Путь к изображениям карт.
        /// </summary>
        public static readonly FilePath CardImages = Images.GetDirectory("Cards");
        /// <summary>
        /// Путь к изображениям частиц.
        /// </summary>
        public static readonly FilePath ParticleImages = Images.GetDirectory("Particles");
        /// <summary>
        /// Путь к музыке.
        /// </summary>
        public static readonly FilePath Music = Data.GetDirectory("Music");
        /// <summary>
        /// Путь к звукам.
        /// </summary>
        public static readonly FilePath Sounds = Data.GetDirectory("Sounds");

        /// <summary>
        /// Путь к пользовательским данным.
        /// </summary>
        public static readonly FilePath User = Root.GetDirectory("User");
        /// <summary>
        /// Путь к изображениям аватаров.
        /// </summary>
        public static readonly FilePath Avatars = User.GetDirectory("Avatars");
        /// <summary>
        /// Путь к колодам.
        /// </summary>
        public static readonly FilePath Decks = User.GetDirectory("Decks");

        /// <summary>
        /// Добавляет суффикс к имени файла (перед расширением).
        /// </summary>
        public static string AddFileNameSuffix(string path, string suffix) {
            var name = Path.GetFileNameWithoutExtension(path);
            var ext = Path.GetExtension(path);
            return name + suffix + ext;
        }
    }

    /// <summary>
    /// Структура, представляющая путь в файловой системе.
    /// </summary>
    public struct FilePath {
        /// <summary>
        /// Экземпляр пустого пути.
        /// </summary>
        public static FilePath Empty = new FilePath(string.Empty);

        private string _path;

        /// <summary>
        /// Создает экземпляр пути.
        /// </summary>
        public FilePath(string path) {
            _path = path ?? string.Empty;
        }

        /// <summary>
        /// Выдает путь к указанному файлу внутри данного пути.
        /// </summary>
        public FilePath this[string name] {
            get { return new FilePath(Path.Combine(_path, name)); }
        }

        /// <summary>
        /// Выдает путь к директории, автоматически создавая её в случае отсутствия.
        /// </summary>
        public FilePath GetDirectory(string name) {
            var path = this[name];
            Directory.CreateDirectory(path);
            return path;
        }

        /// <summary>
        /// Добавляет суффикс к имени файла (перед расширением).
        /// </summary>
        public FilePath AddFileNameSuffix(string suffix) {
            return new FilePath(Paths.AddFileNameSuffix(_path, suffix));
        }

        /// <summary>
        /// Проверяет наличие файла.
        /// </summary>
        public bool Exists {
            get { return string.IsNullOrEmpty(_path) ? false : File.Exists(_path); }
        }

        /// <summary>
        /// Выдает путь в виде строки.
        /// </summary>
        public override string ToString() {
            return _path;
        }

        /// <summary>
        /// Неявно приводит путь к строке.
        /// </summary>
        public static implicit operator string(FilePath path) {
            return path._path;
        }
    }
}
